package cn.mujiankeji.mbrowser.界面.标签页.历史

import androidx.compose.runtime.mutableStateOf
import cn.mujiankeji.mbrowser.app.界面模块
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBHistory
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import org.koin.core.context.GlobalContext

/**
 * 历史标签状态
 * 管理历史记录标签页的状态，包括当前显示的历史记录列表、搜索关键词等
 */
class 历史标签状态() : 标签页状态() {
    init {
        标题.value = "历史记录"
    }
    
    // 搜索关键字
    val 搜索关键字 = mutableStateOf("")
    
    // 是否处于搜索模式
    val 是否搜索模式 = mutableStateOf(false)
    
    // 是否处于编辑模式
    val 是否编辑模式 = mutableStateOf(false)
    
    // 选中的历史记录ID列表（用于批量操作）
    val 选中条目ID列表 = mutableStateOf<List<Long>>(emptyList())
    
    // 是否显示时间分组
    val 是否显示时间分组 = mutableStateOf(true)
    
    // 加载状态
    val 加载状态 = mutableStateOf(false)
    
    // 当前时间筛选
    val 时间筛选 = mutableStateOf(时间筛选类型.全部)
    
    // 当前视图模式
    val 视图模式 = mutableStateOf(历史视图模式.列表)
    
    // 历史记录列表
    val 历史记录列表 = MutableStateFlow<List<DBHistory>>(emptyList())
    
    // 分组后的历史记录
    val 分组历史记录 = MutableStateFlow<Map<String, List<DBHistory>>>(emptyMap())
    
    /**
     * 搜索历史记录
     */
    fun 搜索(关键词: String) {
        搜索关键字.value = 关键词
        是否搜索模式.value = 关键词.isNotEmpty()
    }
    
    /**
     * 切换编辑模式
     */
    fun 切换编辑模式() {
        是否编辑模式.value = !是否编辑模式.value
        // 如果退出编辑模式，清空选中列表
        if (!是否编辑模式.value) {
            选中条目ID列表.value = emptyList()
        }
    }
    
    /**
     * 切换选中状态
     */
    fun 切换选中状态(id: Long) {
        val 当前列表 = 选中条目ID列表.value.toMutableList()
        if (当前列表.contains(id)) {
            当前列表.remove(id)
        } else {
            当前列表.add(id)
        }
        选中条目ID列表.value = 当前列表
    }
    
    /**
     * 全选当前显示的历史记录
     */
    fun 全选() {
        val 所有ID = 历史记录列表.value.map { it.id }
        选中条目ID列表.value = 所有ID
    }
    
    /**
     * 取消全选
     */
    fun 取消全选() {
        选中条目ID列表.value = emptyList()
    }

    fun db() : AppDatabase = GlobalContext.get().get()
    /**
     * 删除选中的历史记录
     */
    suspend fun 删除选中历史记录() {
        val daoHistory = db().历史()
        选中条目ID列表.value.forEach { id ->
            daoHistory.根据Id删除历史记录(id)
        }
        选中条目ID列表.value = emptyList()
        是否编辑模式.value = false
    }
    
    /**
     * 清空所有历史记录
     */
    suspend fun 清空历史记录() {
        db().历史().清空所有历史记录()
        选中条目ID列表.value = emptyList()
        是否编辑模式.value = false
    }
    
    /**
     * 根据时间筛选类型获取起始和结束时间戳
     */
    fun 获取时间范围(类型: 时间筛选类型): Pair<Long, Long> {
        val 当前时间 = Clock.System.now().toEpochMilliseconds()
        val 一天毫秒数 = 24 * 60 * 60 * 1000L
        
        return when (类型) {
            时间筛选类型.全部 -> Pair(0, 当前时间)
            时间筛选类型.今天 -> {
                val 今天开始 = 当前时间 - (当前时间 % 一天毫秒数)
                Pair(今天开始, 当前时间)
            }
            时间筛选类型.昨天 -> {
                val 今天开始 = 当前时间 - (当前时间 % 一天毫秒数)
                val 昨天开始 = 今天开始 - 一天毫秒数
                Pair(昨天开始, 今天开始 - 1)
            }
            时间筛选类型.最近七天 -> {
                val 七天前 = 当前时间 - (7 * 一天毫秒数)
                Pair(七天前, 当前时间)
            }
            时间筛选类型.最近三十天 -> {
                val 三十天前 = 当前时间 - (30 * 一天毫秒数)
                Pair(三十天前, 当前时间)
            }
        }
    }
    
    /**
     * 根据历史记录的时间戳获取分组标题
     */
    fun 获取时间分组标题(时间戳: Long): String {
        val 当前时间 = Clock.System.now().toEpochMilliseconds()
        val 一天毫秒数 = 24 * 60 * 60 * 1000L
        
        val 今天开始 = 当前时间 - (当前时间 % 一天毫秒数)
        val 昨天开始 = 今天开始 - 一天毫秒数
        val 前天开始 = 昨天开始 - 一天毫秒数
        val 本周开始 = 今天开始 - (7 * 一天毫秒数)
        val 本月开始 = 今天开始 - (30 * 一天毫秒数)
        
        return when {
            时间戳 >= 今天开始 -> "今天"
            时间戳 >= 昨天开始 -> "昨天"
            时间戳 >= 前天开始 -> "前天"
            时间戳 >= 本周开始 -> "本周"
            时间戳 >= 本月开始 -> "本月"
            else -> {
                // 将时间戳转换为日期字符串
                val instant = Instant.fromEpochMilliseconds(时间戳)
                val localDateTime = instant.toLocalDateTime(TimeZone.currentSystemDefault())
                "${localDateTime.year}年${localDateTime.monthNumber}月"
            }
        }
    }
    
    /**
     * 对历史记录进行分组
     */
    fun 分组历史记录(历史记录: List<DBHistory>): Map<String, List<DBHistory>> {
        return 历史记录.groupBy { 获取时间分组标题(it.添加时间) }
    }
}

/**
 * 历史记录时间筛选类型
 */
enum class 时间筛选类型 {
    全部,
    今天,
    昨天,
    最近七天,
    最近三十天
}

/**
 * 历史记录视图模式
 */
enum class 历史视图模式 {
    列表,
    网格,
} 